---
title: 面向对象程序设计
---

## 知识点
```java
public class Dog{
    String breed;
    int age;
    String color;
    void barking(){
    }
    void hungry(){
    }
    void sleeping(){
    }
}
```
* 一个类可以 <RedSpan>包含变量和方法</RedSpan>
* 每个类都有 <RedSpan>构造方法</RedSpan>。如果没有显示地为类定义构造方法，Java 编译器将会为该类提供一个默认构造方法，在 <RedSpan>创建一个对象的时候，至少要调用一个构造方法。构造方法的名称必须与类同名</RedSpan>，一个类可以有多个构造方法，下面是一个构造方法示例

```java
public class Puppy {
    public Puppy() {

    }
    public Puppy(String name){
        // 这个构造器仅有一个参数：name
    }
}
```

### 创建对象
对象是根据类创建的。在 Java 中，使用 <RedSpan>关键字 new 来创建一个新的对象。</RedSpan>创建对象需要以下三步：
* 声明：声明一个对象，包括对象名称和对象类型。
* 实例化：使用关键件 new 来创建一个对象
* 初始化：使用 new 创建对象时，会调用构造方法初始化对象。运行后会输出：小狗的名字是 tommy

```java
public class Puppy{
    public Puppy(String name){
        // 这个构造器仅有一个参数：name
        System.out.println("小狗的名字是："+name);
    }
    public static void main(String[] args){
        // 下面的语句将创建一个 Puppy 对象
        Puppy puppty = new Puppy("tommy");
    }
}
```
### 访问实例变量和方法

<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/20241029075705.png"/>

### 访问控制修饰符
在 Java 中，可以使用访问控制符来保护对类、变量、方法和构造方法的访问。

java 支持以下访问权限。
* <RedSpan>private : 在同一类内可见</RedSpan>使用对象有：变量、方法、构造方法。不能修饰类（外部类）
* <RedSpan>public：</RedSpan>对所有类可见，使用对象：类、接口、方法、属性
* <RedSpan>protected</RedSpan>：对同一包和所有子类可见。使用对象：变量、方法。不能修饰类（外部类）

有以下方法继承的规则
* 父类中声明为 public 的方法在子类中也必须声明为 public
* 父类中声明为 protected 的方法在子类中要么声明为 protected，要么声明为 public，不能声明为 private。
* 父类中声明为 private 的方法，不能够被继承。

#### abstract 修饰符
* 抽象类不能用来实例化对象，声明抽象类的 <RedSpan>唯一目的是为了将来对该类进行扩充。</RedSpan>
* <RedSpan>如果一个类包含抽象方法，那么该类一定要声明为抽象类</RedSpan>，否则将出现编译错误。
* 抽象类可以包含抽象方法和非抽象方法。
* 抽象方法是一种 <RedSpan>没有任何实现的方法</RedSpan>，该方法的具体实现由子类提供。
* 任何 <RedSpan>继承抽象类的子类必须实现父类所有的抽象方法，除非该子类也是抽象类。</RedSpan>
* 如果一个类包含若干抽象方法，那么该类必须声明为抽象类。<RedSpan>抽象类可以不包含抽象方法，抽象方法的声明以分号结尾</RedSpan>

```java
abstract class Caravan{
    private double price;
    private String model;
    private String year;
    public abstract void getFast();// 抽象方法
    public abstract void changeColor();
}
public abstract class SuperClass{
    abstract void m(); // 抽象方法
}
class SubClass extends SuperClass{
    void m(){ // 实现抽象方法
    }
}
```
### java 继承的特性
* 子类可以拥有父类非 private 的属性、方法
* 子类可以拥有自己的属性和方法，即子类可以对父类进行扩展。
* 子类可以用自己的方式实现父类的方法。
* 继承可以使用关键字 extends 和 implements 这两个关键字来实现。
* extends 关键字，在 Java 中 ，类的继承是单一继承，也就是说，一个子类只能拥有一个父类，所以 <RedSpan>extends 只能继承一个类</RedSpan>

* <RedSpan>使用 implements 关键字可以变相的使 Java 具有多继承的特性</RedSpan>，使用范围为 <RedSpan>类继承接口的情况</RedSpan>，可以 <RedSpan>同时继承多个接口</RedSpan>（接口和接口之间使用逗号分隔）。
```java
public class Animal {
    private String name;
    private int id;
    public Animal(String myName,String myId){
        // 初始化属性值
    }
    public void eat(){// 吃东西方法的具体实现}
    public void sleep(){// 睡觉方法的具体实现}
}
public class Penguir extends Animal {
}
public interface A{
    public void eat();
    public void sleep();
}
public interface B{
    public void show();
}
public class C implements A,B {
}
```

## 解题技巧
下午考试的第 5、6 题为二选一做答，都是程序填空，<RedSpan>原理一摸一样，只不过一个用 C++语言，一个用 Java 语言编写的程序，</RedSpan>并且这个填空 <RedSpan>只考基本语法，不涉及算法</RedSpan>，比之第 4 题算法设计的填空要简单很多，完全可以拿满分。

面向对象的程序填空分为两类，<RedSpan>一个是考察纯定义</RedSpan>，如接口类、抽象类、接口类中的函数定义等，这些根据程序代码可以快速判断出。

另一类，就是 <RedSpan>关于设计的，填写函数体</RedSpan>，但是这个函数体 <RedSpan>并不是要写一段真正的程序实现代码，而是调用形式的，都是有调用函数的，这些调用函数一般在程序中，或者在说明和类图中可以找到</RedSpan>，考察的是调用形式。

## 真题一
<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/20241029082747.png"/>
<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/20241029084254.png"/>
<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/20241029084320.png"/>
<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/20241029084340.png"/>

## 真题二
<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/20241029204640.png"/>
<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/20241029222533.png"/>
<img src="https://wkq-img.oss-cn-chengdu.aliyuncs.com/20241029222553.png"/>